package com.mall.service;

import java.util.List;
import com.mall.entity.Order;

import com.mall.common.PageResult;
import com.mall.dto.OrderCreateDTO;
import com.mall.vo.OrderVO;

/**
 * 订单服务接口
 * 
 * @author Mall Team
 */
public interface OrderService {
    
    /**
     * 创建订单（从购物车）
     */
    String createOrder(Long userId, OrderCreateDTO orderCreateDTO);
    
    /**
     * 直接下单（不通过购物车）
     */
    String createDirectOrder(Long userId, OrderCreateDTO.DirectOrderDTO directOrderDTO);
    
    /**
     * 获取订单详情
     */
    OrderVO.OrderDetailVO getOrderDetail(Long userId, Long orderId);
    
    /**
     * 根据订单号获取订单详情
     */
    OrderVO.OrderDetailVO getOrderDetailByOrderNo(Long userId, String orderNo);
    
    /**
     * 获取用户订单列表
     */
    PageResult<OrderVO.OrderListVO> getUserOrderPage(Long userId, Integer status, 
                                                    Integer pageNum, Integer pageSize);
    
    /**
     * 取消订单
     */
    void cancelOrder(Long userId, Long orderId);
    
    /**
     * 根据订单号取消订单
     */
    void cancelOrderByOrderNo(Long userId, String orderNo);
    
    /**
     * 确认收货
     */
    void confirmOrder(Long userId, Long orderId);
    
    /**
     * 删除订单（逻辑删除）
     */
    void deleteOrder(Long userId, Long orderId);
    
    /**
     * 支付订单
     */
    void payOrder(String orderNo);
    
    /**
     * 发货（管理员功能）
     */
    void shipOrder(Long orderId);
    
    /**
     * 分页查询所有订单（管理员功能）
     */
    PageResult<OrderVO> getAllOrderPage(Integer status, String orderNo, 
                                       Integer pageNum, Integer pageSize);
    
    /**
     * 更新订单状态（管理员功能）
     */
    void updateOrderStatus(Long orderId, Integer status);
    
    /**
     * 获取订单统计信息
     */
    OrderStatisticsVO getOrderStatistics(Long userId);

    // 管理端：订单详情
    OrderVO.OrderDetailVO getOrderDetailByAdmin(Long orderId);

    // 管理端：删除订单
    void deleteOrderByAdmin(Long orderId);
    
    /**
     * 订单统计VO
     */
    class OrderStatisticsVO {
        private Long pendingPayment;    // 待付款
        private Long paid;              // 已付款
        private Long shipped;           // 已发货
        private Long completed;         // 已完成
        
        // getters and setters
        public Long getPendingPayment() { return pendingPayment; }
        public void setPendingPayment(Long pendingPayment) { this.pendingPayment = pendingPayment; }
        public Long getPaid() { return paid; }
        public void setPaid(Long paid) { this.paid = paid; }
        public Long getShipped() { return shipped; }
        public void setShipped(Long shipped) { this.shipped = shipped; }
        public Long getCompleted() { return completed; }
        public void setCompleted(Long completed) { this.completed = completed; }
    }
    // 管理端：分页获取订单列表
    List<OrderVO.OrderListVO> listOrders(Integer pageNum, Integer pageSize, Integer status);

    // 管理端：编辑订单（仅允许修改收货信息和备注）
    void updateOrderByAdmin(Order order);
}